/*
CTMfc para javacup tactica del equipo y metodos solicitados a implementar.
Copyright (C) 2009  Rodrigo Quinteros Maul�n

Este programa es Software Libre; Usted puede redistribuirlo y/o modificarlo 
bajo los t�rminos de la GNU Licencia P�blica General (GPL) tal y como ha sido 
p�blicada por la Free Software Foundation; o bien la versi�n 2 de la Licencia, 
o (a su opci�n) cualquier versi�n posterior.
La licencia se encuentra en http://www.es.gnu.org/modules/content/index.php?id=8


Este programa se distribuye con la esperanza de que sea �til, pero SI NINGUNA 
GARANT�A; tampoco las impl�citas garant�as de MERCANTILIDAD o ADECUACI�N A UN 
PROP�SITO PARTICULAR. Consulte la GNU General Public License (GPL) para m�s  
detalles. Usted debe recibir una copia de la GNU General Public License (GPL) 
junto con este programa; si no, escriba a la Free Software Foundation Inc.    
51 Franklin Street, 5� Piso, Boston, MA 02110-1301, USA.

*/
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.chimbaroloco;

/**
 *
 * @author rquinteros
 */
import org.javahispano.javacup.modelo.*;
import java.util.List;
import java.util.LinkedList;

public class ctmfctactic implements Tactica {
            
        ctmfcdetalletactic detalle = new ctmfcdetalletactic();
    
        Posicion alineacion1[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-0.7132867132867133,-36.34615384615385),
        new Posicion(-20.447552447552447,-36.58371040723982),
        new Posicion(20.20979020979021,-36.82126696832579),
        new Posicion(-11.412587412587413,-26.131221719457013),
        new Posicion(12.125874125874127,-27.794117647058822),
        new Posicion(-0.23776223776223776,-0.47511312217194573),
        new Posicion(1.6643356643356644,-0.23755656108597287),
        new Posicion(-1.188811188811189,-9.739819004524888),
        new Posicion(-8.321678321678322,-6.651583710407239),
        new Posicion(6.6573426573426575,-8.076923076923077)
    };

    Posicion alineacion2[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(0.23776223776223776,-32.07013574660634),
        new Posicion(-20.20979020979021,-34.920814479638004),
        new Posicion(20.685314685314687,-35.63348416289593),
        new Posicion(-13.552447552447552,-20.667420814479637),
        new Posicion(14.97902097902098,-20.90497737556561),
        new Posicion(-10.937062937062937,-0.7126696832579186),
        new Posicion(10.6993006993007,-1.4253393665158371),
        new Posicion(-7.846153846153847,-6.414027149321266),
        new Posicion(-1.188811188811189,-11.64027149321267),
        new Posicion(4.9930069930069925,-9.264705882352942)
    };

    Posicion alineacion3[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-0.4755244755244755,-34.44570135746606),
        new Posicion(-19.496503496503497,-34.44570135746606),
        new Posicion(21.874125874125873,-34.44570135746606),
        new Posicion(-15.93006993006993,-15.678733031674208),
        new Posicion(13.552447552447552,-18.054298642533936),
        new Posicion(-18.78321678321678,4.751131221719457),
        new Posicion(19.734265734265733,3.5633484162895925),
        new Posicion(-1.6643356643356644,10.214932126696834),
        new Posicion(-10.937062937062937,31.119909502262445),
        new Posicion(9.986013986013985,32.782805429864254)
    };

    Posicion alineacion4[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-10.937062937062937,-34.920814479638004),
        new Posicion(-24.48951048951049,-33.49547511312217),
        new Posicion(6.419580419580419,-34.44570135746606),
        new Posicion(-1.902097902097902,-15.91628959276018),
        new Posicion(23.062937062937063,-36.10859728506787),
        new Posicion(-17.594405594405593,8.076923076923077),
        new Posicion(11.65034965034965,8.076923076923077),
        new Posicion(0.23776223776223776,19.95475113122172),
        new Posicion(-7.608391608391608,35.15837104072398),
        new Posicion(7.37062937062937,35.39592760180996)
    };

    Posicion alineacion5[]=new Posicion[]{
        new Posicion(0.0,-51.074660633484164),
        new Posicion(-8.55944055944056,-34.44570135746606),
        new Posicion(-22.349650349650346,-25.893665158371043),
        new Posicion(7.608391608391608,-35.63348416289593),
        new Posicion(-11.412587412587413,-12.115384615384617),
        new Posicion(21.636363636363637,-24.943438914027148),
        new Posicion(-23.3006993006993,9.502262443438914),
        new Posicion(9.272727272727272,-11.165158371040723),
        new Posicion(21.636363636363637,9.027149321266968),
        new Posicion(2.377622377622378,34.20814479638009),
        new Posicion(-8.321678321678322,25.18099547511312)
    };

    Posicion alineacion6[]=new Posicion[]{
        new Posicion(0.7132867132867133,-51.31221719457013),
        new Posicion(-6.181818181818182,-33.49547511312217),
        new Posicion(-21.3986013986014,-36.10859728506787),
        new Posicion(6.419580419580419,-33.49547511312217),
        new Posicion(4.755244755244756,-14.25339366515837),
        new Posicion(19.25874125874126,-35.8710407239819),
        new Posicion(-10.6993006993007,0.7126696832579186),
        new Posicion(13.314685314685315,15.678733031674208),
        new Posicion(-16.643356643356643,17.816742081447966),
        new Posicion(5.468531468531468,28.031674208144796),
        new Posicion(-7.608391608391608,34.68325791855204)
    };

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    return alineacion1;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    return alineacion2;
    }

    public TacticaDetalle getDetalle() {
        return detalle;
    }

    //retorna al mas libre dentro de la cancha
        public Posicion maslibre(SituacionPartido sp1){
    
    int i=2,j;
    double cerca=sp1.misJugadores()[i].distancia(sp1.rivales()[(sp1.misJugadores()[i].indicesMasCercanos(sp1.rivales())[0])]);
    for(j=3;j<11;j++){
    if(cerca > sp1.misJugadores()[j].distancia(sp1.rivales()[(sp1.misJugadores()[j].indicesMasCercanos(sp1.rivales())[0])])){
        cerca=sp1.misJugadores()[j].distancia(sp1.rivales()[(sp1.misJugadores()[j].indicesMasCercanos(sp1.rivales())[0])]);
        i=j;
    }
    
    }
    return sp1.misJugadores()[i];
   }
        int alig=7;

        void cambia(){
        alig++;
        if(alig>7){
            alig=3;
            }
        }
        
        LinkedList<Comando> comandos = new LinkedList<Comando>();
    public List<Comando> ejecutar(SituacionPartido sp) {
        int i,ip=1;
         int jp=0;
        int[] cercanosmios= new int[11];
        int[] cercanosrival= new int[11];
        cercanosmios=sp.balon().indicesMasCercanos(sp.misJugadores());
        cercanosrival=sp.balon().indicesMasCercanos(sp.rivales());
        //jugadores a posicion 3
        comandos.clear();
        if(sp.golesRival()>sp.golesPropios()){
            cambia();
        }
        if(alig==3){
         for (i=0;i<11;i++){
                    comandos.add(new ComandoIrA(i, alineacion3[i]));
                }
        }
           if(alig==4){
         for (i=0;i<11;i++){
                    comandos.add(new ComandoIrA(i, alineacion4[i]));
                }
        }
           if(alig==5){
         for (i=0;i<11;i++){
                    comandos.add(new ComandoIrA(i, alineacion5[i]));
                }
        }
           if(alig==6){
         for (i=0;i<11;i++){
                    comandos.add(new ComandoIrA(i, alineacion6[i]));
                }
        }
        if(alig==7){
        for(i=1;i<11;i++){
            if(sp.rivales()[i].getY()<0){
               comandos.add(new ComandoIrA( sp.rivales()[i].indicesMasCercanos(sp.misJugadores(), 0)[0],sp.rivales()[i]));

            }

            jp=0;
        }
        for(i=1;i<11;i++){
            if(sp.misJugadores()[i].getY()>=0){
                comandos.add(new ComandoIrA(i,Constantes.penalSup.media(sp.rivales()[Constantes.penalSup.indicesMasCercanos(sp.rivales())[jp]], sp.rivales()[Constantes.penalSup.indicesMasCercanos(sp.rivales())[jp+1]])));
                jp++;
            }
        }

        comandos.add(new ComandoIrA(0, alineacion4[0]));

        }
     
        //en pocesion del balon
        if (sp.balon().distancia(sp.misJugadores()[cercanosmios[0]]) <= Constantes.DISTANCIA_CONTROL_BALON){
            // verificar si soy el mas libre mas libre y los contrariso mas cercanos estan adelante
            if(sp.misJugadores()[cercanosmios[0]].getX()==maslibre(sp).getX()&&sp.misJugadores()[cercanosmios[0]].getY()==maslibre(sp).getY() && (sp.rivales()[cercanosrival[0]].getY()>sp.misJugadores()[cercanosmios[0]].getY() && sp.rivales()[cercanosrival[0]].getY()>sp.misJugadores()[cercanosmios[1]].getY())){
                    comandos.add(new ComandoGolpearBalon(cercanosmios[0], Constantes.centroArcoSup.media(sp.rivales()[cercanosrival[0]], sp.rivales()[cercanosrival[1]]), 0.4, 10));
                     comandos.add(new ComandoIrA(cercanosmios[0],Constantes.centroArcoSup.media(sp.rivales()[cercanosrival[0]],sp.rivales()[cercanosrival[1]])));
            }else{
                if (cercanosmios[0]==0){
                    comandos.add(new ComandoGolpearBalon(cercanosmios[0], new Posicion(-sp.rivales()[cercanosrival[0]].getX(),0), 1, 45));
                
                }
                //distancias de arco
                else{
                    //listo para tirar
                    if(sp.balon().distancia(Constantes.centroArcoSup)<=30){
                        if(sp.misJugadores()[cercanosmios[0]].getX()>=0){
                        comandos.add(new ComandoGolpearBalon(cercanosmios[0], new Posicion(+2,Constantes.centroArcoSup.getY()), 1, 25));
                        }else{
                        comandos.add(new ComandoGolpearBalon(cercanosmios[0], new Posicion(-2,Constantes.centroArcoSup.getY()), 1, 25));
                        }
                        if(sp.balon().distancia(Constantes.centroArcoSup)<=18){
                          if(sp.misJugadores()[cercanosmios[0]].getX()>=0){
                        comandos.add(new ComandoGolpearBalon(cercanosmios[0], new Posicion(-2.2,Constantes.centroArcoSup.getY()), 0.95, 22));
                        }else{
                        comandos.add(new ComandoGolpearBalon(cercanosmios[0], new Posicion(+2.2,Constantes.centroArcoSup.getY()), 0.95, 22));
                        }
                     }
                    }//otros casos
                    else{
                        //cerca del arco propio
                        if(sp.balon().distancia(Constantes.centroArcoInf)<=40){
                        comandos.add(new ComandoGolpearBalon(cercanosmios[0],new Posicion(-sp.rivales()[cercanosrival[0]].getX(),0), 1, 25));
                        }
                        else{//dar pase hacia adelante siempre
                            for(ip=1;ip<11;ip++){
                                if( sp.misJugadores()[cercanosmios[ip]].getY()> sp.misJugadores()[cercanosmios[0]].getY()){
                                    comandos.add(new ComandoGolpearBalon(cercanosmios[0], sp.misJugadores()[cercanosmios[ip]], 0.75, 20));
                                    break;
                                }
                        }
                    }
                       if(ip==11){
                       comandos.add(new ComandoGolpearBalon(cercanosmios[0], Constantes.centroArcoSup, 0.25, 10));
                     comandos.add(new ComandoIrA(cercanosmios[0],Constantes.centroArcoSup));

                       }

                }
            
            }
            
               }
        }
        //tiro de esquina propio
       if(sp.balon()==Constantes.cornerSupDer || sp.balon()==Constantes.cornerSupIzq ) {
                 comandos.add(new ComandoIrA(cercanosmios[0],sp.balon()));
                  comandos.add(new ComandoIrA(cercanosmios[1], Constantes.penalSup));
                  comandos.add(new ComandoIrA(cercanosmios[2], new Posicion(Constantes.penalSup.getX()-5,Constantes.penalSup.getY()+4)));
                  comandos.add(new ComandoGolpearBalon(cercanosmios[0], Constantes.penalSup, 0.9, 30));
                  comandos.add(new ComandoIrA(cercanosmios[2], new Posicion(Constantes.penalSup.getX()+5,Constantes.penalSup.getY()+4)));
       }
       else{       //tiro de esquina rival
         if(sp.balon()==Constantes.cornerInfDer ||sp.balon()==Constantes.cornerInfIzq) {
                 comandos.add(new ComandoIrA(cercanosmios[0],sp.balon()));
                  comandos.add(new ComandoIrA(cercanosmios[1], Constantes.penalInf));
                  comandos.add(new ComandoIrA(cercanosmios[2], new Posicion(Constantes.penalInf.getX()-5,Constantes.penalInf.getY()+4)));
                  comandos.add(new ComandoIrA(cercanosmios[2], new Posicion(Constantes.penalInf.getX()+5,Constantes.penalInf.getY()+4)));
        }
         else{
        //si el mas cercano es mio ir al balon
        if ((sp.balon().distancia(sp.misJugadores()[cercanosmios[0]]))<(sp.balon().distancia(sp.rivales()[cercanosrival[0]]))){
                comandos.add(new ComandoIrA(cercanosmios[0],sp.balon()));
                
        }
        else{
        //decidir si bloquear o interceptar
            comandos.add(new ComandoIrA(cercanosmios[0],sp.balon()));
             comandos.add(new ComandoIrA(cercanosmios[1],sp.balon()));
              comandos.add(new ComandoIrA(cercanosmios[2],sp.balon()));
               comandos.add(new ComandoIrA(cercanosmios[3],sp.balon()));
                //comandos.add(new ComandoIrA(cercanosmios[4],sp.balon()));
        }
        }
         if(sp.balon().distancia(sp.misJugadores()[0])<=Constantes.DISTANCIA_CONTROL_BALON_PORTERO){
            comandos.add(new ComandoGolpearBalon(cercanosmios[0],new Posicion(-sp.rivales()[cercanosrival[0]].getX(),0), 1, 45));
         }
         if(sp.saco()&& cercanosmios[0]!=0){
             comandos.add(new ComandoGolpearBalon(cercanosmios[0], sp.misJugadores()[cercanosmios[1]], 0.75, 20));
         }
      }
    return comandos;
    }
}